/**
 *
 */
package com.czmh.etc.onlinepubsys.services;

import com.czmh.etc.onlinepubsys.dto.ApplyListDto;
import com.czmh.etc.onlinepubsys.dto.ApplyProgressDto;
import com.czmh.etc.onlinepubsys.dto.EtcAddressbookDto;
import com.czmh.etc.onlinepubsys.entity.mingchuang.EtcOrder;
import com.czmh.etc.onlinepubsys.json.JsonResult;
import com.czmh.etc.onlinepubsys.model.EtcDevice;
import com.czmh.etc.onlinepubsys.model.EtcObuDTO;
import com.czmh.etc.onlinepubsys.request.DeliverETCEquipmentRequest;
import com.czmh.etc.onlinepubsys.response.WxPrePayResponse;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @描述：订单服务
 * @author： Seven.
 * @创建日期：Jun 11, 2019 3:39:11 PM.
 * @版本：1.0.0
 */
public interface EtcOrderService {

    Integer queryEtcPayState(String productSn, Integer payState, Integer payMode);

    /**
     * 提交设备的收货地址，生成订单
     *
     * @param addr                收货地址
     * @param provinceCode        省份代码：广东：yue，云南：dian
     * @return            返回订单id
     */
    String submitaddrOrder(EtcAddressbookDto addr, String provinceCode);

    /**
     * 查询申办进度
     *
     * @param order_id     订单id
     * @return
     */
    List<ApplyProgressDto> getApplyProgress(String order_id);

    /**
     * 微信支付生成微信支付预交易单
     *
     * @param order_id               内部订单id
     * @param user_id                用户id
     * @param spbill_create_ip       终端IP
     * @return
     */
    WxPrePayResponse preWxPayOrder(String order_id, String user_id, String spbill_create_ip) throws Exception;

    /**
     * 确认收货
     *
     * @param order_id         订单id
     */
    void confirmgoods(String order_id);

    /**
     * 获取该用户已提交但未完成激活步骤的的OBU发行申请
     * @param user_id          用户id
     * @return
     */
    List<ApplyListDto> applylist(String user_id);

    /**
     * 回调通知签名验证
     *
     * @param payWayCode
     * @param notifyMap
     * @return
     */
    Boolean verifyNotify(String payWayCode, Map<String,String> notifyMap) throws Exception;

    /**
     * 处理支付通知校验成功后的业务逻辑
     *
     * @param payWayCode 支付方式
     * @param notifyMap 回调通知的参数
     * @throws Exception 异常
     */
    void dealPaymentNotifySuccess(String payWayCode, Map<String,String> notifyMap);

    /**
     * 审批用户申请
     *
     * @param applyId 审批的applyID
     * @param passed 是否审批通过，是为通过，否为不通过
     * @param rejectMSG 若为审批不通过，拒绝的原因
     * @param approvedUserID 负责审批的人员ID
     * @throws Exception 异常
     */
    void approveETCApply(String applyId, boolean passed, String rejectMSG, Integer approvedUserID);

    /**
     * 后台系统，ETC设备发货，更新发货状态
     * @param detail
     * @param deliverUserId
     * @param deliverTime
     */
    void deliverETCEquipment(DeliverETCEquipmentRequest.DeliverETCDetail detail, Integer deliverUserId, Date deliverTime);

    /**
     * 申请退款
     *
     * @param order_id              订单id
     * @param user_id               用户id
     * @return
     * @throws Exception
     */
    JsonResult refundWxPayOrder(String order_id, String user_id) throws Exception;

    /**
     * 更新订单退款状态
     *
     * @param out_trade_no          订单号
     */
    void updateOrderRefund(String out_trade_no);

    /**
     * 根据订单号查询订单状态和设备状态
     * @param OrderNo
     * @return
     */
    EtcOrder queryByOrderNo(String OrderNo);

    /**
     * 更新订单
     * @param etcOrder
     * @return
     */
    int updateById(EtcOrder etcOrder);

    /**
     * 根据产品编码查询产品是否存在
     * @param productSn 订单号
     * @return
     */
    int isExistProductSn(String productSn);

    /**
     * 根据根据产品编号查询产品是否被支付
     * @param productSn 产品编号
     * @return
     */
    Integer queryByProductSn(String productSn, Integer payState);

    Integer queryByProductSn(String productSn, Integer payState, Integer payMode);

    EtcDevice queryObject(Map<String, Object> queryMap);

    int updateObject(EtcDevice etcDevice);


    Integer queryEtcPayState(String productSn, Integer payState);

    int deleteById(EtcOrder etcOrder);
}
